package tools;

import com.opensymphony.xwork2.ActionSupport;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import java.io.File;
import java.sql.Blob;

//改进解决简单的多线程问题
//使用单例模式--2021年3月30日
//为了提高代码的稳定性和适合线程相关的session分配,废除单例--2021年5月9日
//session的事务尽可能的复用而不是尽可能提交--2021年5月25日
public class HibernateTools  extends ActionSupport {
    //gaohiber--来自高金磊
       private static Configuration configuration;
       private static SessionFactory sessionFactory;

    //       private static Transaction transaction;
        private static void init(){
            configuration=new Configuration().configure();
            sessionFactory=configuration.buildSessionFactory();
        }

//为了提高代码的稳定性和适合线程相关的session分配,废除单例--2021年5月9日
        public synchronized static Session getSession() {
            if (configuration==null||sessionFactory==null)
                init();
            Session session=sessionFactory.getCurrentSession();
//            try {
//                if (session!=null&&!session.getTransaction().isActive()) {
//                    session.getTransaction().begin();
//                    return session;
//                }
//            }catch (Exception e){
//            }
//            session=sessionFactory.getCurrentSession();//这个不强制手动关
//            session=sessionFactory.openSession();//注意,此处如果执行过多应该检查问题,会造成连接池爆炸
            try {
                if (session.getTransaction().isActive()) {//上一个事务没有关闭(因为异常---或者兼容代码错误(忘了关闭))
                    //改为不关闭继续使用
//                    session.getTransaction().commit();
//                    session=sessionFactory.getCurrentSession();
                }
                else {
                    session.getTransaction().begin();
                }
            } catch (Exception e) {//事务已经开启,或者上次没有正常关闭--最后一次挽救--频繁调用可能会出现
                System.out.println("事务已经开启,或者上次没有正常关闭");
                session.close();
                session=sessionFactory.getCurrentSession();
                session.getTransaction().begin();

            }
            return session;
        }

        @Deprecated//本方法设计不适用于getCurrentSession  后续开发请不要使用
        public static void commit(Session session){
            try {
                session.getTransaction().commit();//既然一个线程一个session,这个session就是调用线程的session
            } catch (Exception e) {
                System.out.println("session关闭异常,已经自动恢复");
            }
//                session.beginTransaction();//为了应对destory的commit
        }
        //方法弃用使用单例模式来管理session
//        private static void commitAndDestory(Session session){
//
//            session.getTransaction().commit();//为了防止没有commmit就提交
//            session.close();
////            sessionFactory.close();//单例的没有必要关闭
//        }
        public static Blob File_To_Blob(File file){
            return File_To_Blob(filetobytes.Filetobyte(file));
        }
        public static Blob File_To_Blob(byte[] data){
            Blob blob=getSession().getLobHelper().createBlob(data);
//            commit();//getCurrentSession下不要主动关闭其他线程的session
            return blob;
        }
}
